package com.zxj.hadoop.demo.mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


/**
 * 相当于运行在yarn中的客户端
 * @author Administrator
 *
 */
public class WordCountDriver {

	public static void main(String[] args) throws IOException {
        runYarn(args);
	}

    /**
     * 运行在服务器的yarn上面
     * @param args
     * @throws IOException
     */
    public static void runYarn(String[] args) throws IOException {
        System.setProperty("HADOOP_USER_NAME","hadoop");
        Configuration conf = new Configuration();
        //运行在yarn的集群模式
        conf.set("mapreduce.framework.name","yarn");
        conf.set("yarn.resourcemanager.hostname","server1");//这行配置，使得该main方法会寻找该机器的mr环境
        conf.set("fs.defaultFS","hdfs://server1:9000/");


        Job job = Job.getInstance(conf);
        //使得hadoop可以根据类包，找到jar包在哪里，如果是在开发工具中运行，那么则是找不到的
        //job.setJarByClass(WordCountDriver.class);
        job.setJar("G:\\workspace\\study_workspace\\hadoop-demo\\hadoop-mapreduce\\target\\hadoop-mapreduce-1.0.jar");

        //指定Mapper的类
        job.setMapperClass(WordCountMapper.class);
        //指定reduce的类
        job.setReducerClass(WordCountReduce.class);

        //设置Mapper输出的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        //设置最终输出的类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        //指定输入文件的位置，这里为了灵活，接收外部参数
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        //指定输入文件的位置，这里接收启动参数
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        //将job中的参数，提交到yarn中运行
        //job.submit();
        try {
            job.waitForCompletion(true);
            //这里的为true,会打印执行结果
        } catch (ClassNotFoundException | InterruptedException e) {
            e.printStackTrace();
        }
    }

	/**
	 * 在本地运行
	 * @param args
	 * @throws IOException
	 */
	public static void runLocal(String[] args) throws IOException {
		Configuration conf = new Configuration();
		//这个默认值就是local，其实可以不写
		conf.set("mapreduce.framework.name", "local");
		//本地模式运行mr程序时，输入输出可以在本地，也可以在hdfs中，具体需要看如下的两行参数
		//这个默认值 就是本地，其实可以不配
		//conf.set("fs.defaultFS","file:///");
		//conf.set("fs.defaultFS","hdfs://server1:9000/");



		Job job = Job.getInstance(conf);

		//使得hadoop可以根据类包，找到jar包在哪里
		job.setJarByClass(WordCountDriver.class);

		//指定Mapper的类
		job.setMapperClass(WordCountMapper.class);
		//指定reduce的类
		job.setReducerClass(WordCountReduce.class);

		//设置Mapper输出的类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);

		//设置最终输出的类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);

		//指定输入文件的位置，这里为了灵活，接收外部参数
		FileInputFormat.setInputPaths(job, new Path(args[0]));
		//指定输入文件的位置，这里接收启动参数
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		//将job中的参数，提交到yarn中运行
		//job.submit();
		try {
			job.waitForCompletion(true);
			//这里的为true,会打印执行结果
		} catch (ClassNotFoundException | InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 打包成jar在服务器中运行
	 * @param args
	 * @throws IOException
	 */
	private static void runServer(String[] args) throws IOException {
		Configuration conf = new Configuration();
		//如果是打包在linux上运行，则不需要写这两行代码
/*		//指定运行在yarn中
		conf.set("mapreduce.framework.name", "yarn");
		//指定resourcemanager的主机名
		conf.set("yarn.resourcemanager.hostname", "server1");*/

		conf.set("mapreduce.framework.name", "local");
		conf.set("fs.defaultFS","file:///");


		Job job = Job.getInstance(conf);

		//使得hadoop可以根据类包，找到jar包在哪里
		job.setJarByClass(WordCountDriver.class);

		//指定Mapper的类
		job.setMapperClass(WordCountMapper.class);
		//指定reduce的类
		job.setReducerClass(WordCountReduce.class);

		//设置Mapper输出的类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);

		//设置最终输出的类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);

		//指定输入文件的位置，这里为了灵活，接收外部参数
		FileInputFormat.setInputPaths(job, new Path(args[0]));
		//指定输入文件的位置，这里接收启动参数
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		//将job中的参数，提交到yarn中运行
		//job.submit();
		try {
			job.waitForCompletion(true);
			//这里的为true,会打印执行结果
		} catch (ClassNotFoundException | InterruptedException e) {
			e.printStackTrace();
		}
	}


}
